import axios from 'axios'
import router from '../router'
import store from '../store'
import { Toast } from 'vant'

/**
 * 这里时提前封装好的提示函数，后面需要时可以加入参数后直接调用

 */
const tip = msg => {
  Toast({ // 用的是Vant的提示组件
    message: msg,
    duration: 1000,
    forbidClick: true
  })
}

/**
 * 封装定义请求失败或出错时，不是200时的状态处理，方便后面状态拦截器直接使用
 * status 请求失败的状态码
 * 判断返回的状态码，状态码的返回要与后台人员对接好，不同状态码的代表不同的返回信息
 */
const errorHandle = (status) => {
  switch (status) {
    // 404：请求资源不存在
    case 404:
      tip('您请求的资源不存在')
      break
    // 其他的错误情况
    default:
      tip('未知错误，请联系网站管理员')
  }
}

// 创建axios实例
var instance = axios.create({timeout: 10000}) // 请求超时时长

// 设置post默认请求消息头
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */

instance.interceptors.request.use(
  // 发送请求前，需要做些什么
  config => {
    let token = window.localStorage.getItem('token')
    // 发送请求前，在请求中带token
    config.headers['token'] = token
    return config
  },
  error => {
    console.log('出错')
    Promise.error(error)
  }
)

// 响应拦截器
instance.interceptors.response.use(
  // 请求成功时 ,即响应为200时
  // res => res.status === 200 ? Promise.resolve(res.data.data) : Promise.reject(res),
  res => {
    if(res.status === 200) { // 当为200时，判断请求回来后code状态
      if(res.data.code == 1) { // 为1时就是请求成功
        return Promise.resolve(res.data)
      } else if(res.data.code == 0){
        // 不是1的情况下 ，即后台发出不成功状态下。
        // 返回错误信息
        return Promise.resolve(res.data)
      } else if(!res.data.code){
        return Promise.resolve(res.data)
      }
    } else {
      return Promise.reject(res)
    }
  },

  // 请求失败，不是200时的情况
  error => {
    const { response } = error
    if (response) {
      // 下面就用到了，上面封装好的状态请求处理的方法 errorHandle
      errorHandle(response.status, response.data.message)
      return Promise.reject(response)
    } else {
      // 处理断网的情况，断网情况下弹出断网提示
      if (!window.navigator.onLine) {
        tip('网络好像开小差了，哇咔咔')
      } else {
        return Promise.reject(error)
      }
    }
  }
)

// 输出
export default instance
